package com.eianiao.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;

import com.eianiao.bean.ShoppingCart;
import com.eianiao.dao.ShoppingCartDao;
import com.eianiao.service.ShoppingCartService;
import com.eianiao.utils.BaseContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.List;

@Service
@Transactional
public class ShoppingCartServiceImpl implements ShoppingCartService {

    @Autowired
    private ShoppingCartDao shoppingCartDao;

    /**
     *  1. 添加购物车其实也是做添加操作，但是不能无脑的认识就是直接添加数据库。
     *  2. 这里传递过来的shoppingCart对象指的是用户在前端点击加入购物车的菜品|套餐
     *  3. 添加购物车涉及到添加操作，也可能涉及到更新操作，到底是添加还是更新？
     *      3.1 判定购物车表里面，有没有这件菜品|套餐。就可以知道是添加还是更新了
     *          3.1.1 根据用户的id和菜品 |  套餐的id来校验
     *          3.1.2 根据上面的条件来查询购物车表看看有没有数据存在
     *
     *              3.1.2.1. 如果没有这件菜品|套餐，那么就执行添加操作
     *                  a. 补充数据： user_id  create_time  number
     *
     *                  b. 然后执行添加操作
     *
     *              3.1.2.2. 如果有这件菜品|套餐，那么就执行更新操作
     *                  a. 更新数量即可
     *
     *
     * @param shoppingCart
     * @return
     */
    @Override
    public ShoppingCart add(ShoppingCart shoppingCart) {

        //1. 按着用户id和菜品的id或者套餐的id去查询购物车表，看看这个用户有没有这个菜品|套餐
        LambdaQueryWrapper<ShoppingCart> qw = new LambdaQueryWrapper<>();
        //1.1 设置查询条件：用户id
        qw.eq(ShoppingCart::getUserId , BaseContext.getCurrentId());

        //1.2 判断添加的商品是菜品还是套餐,然后追加查询条件
        if(shoppingCart.getDishId() != null){
            //如果进入了这里，即表示页面打算把一件菜品加入购物车
            qw.eq(ShoppingCart::getDishId , shoppingCart.getDishId());
        }else{
            //如果进入了这里，即表示页面打算把套餐加入购物车
            qw.eq(ShoppingCart::getSetmealId , shoppingCart.getSetmealId());
        }

        //2. 执行查询操作，看看表里面有没有这个用户的这件商品（菜品|套餐）的数据
        ShoppingCart cartInDB = shoppingCartDao.selectOne(qw);

        //3. 判定数据库有还是没有这件商品
        if(cartInDB == null){
            //3.1 如果进入了这里，即表示这件商品，在表里面没有： 要执行添加操作
            shoppingCart.setUserId(BaseContext.getCurrentId());
            shoppingCart.setCreateTime(LocalDateTime.now());
            shoppingCart.setNumber(1);

            shoppingCartDao.insert(shoppingCart);
            return shoppingCart;

        }else{
            //3.2 如果进入了这里，即表示有这件商品： 要执行更新操作
            cartInDB.setNumber(cartInDB.getNumber() + 1);
            shoppingCartDao.updateById(cartInDB);
            return cartInDB;
        }

    }


    /**
     * 根据用户id来查询该用户的购物车数据
     * @param uid
     * @return
     */
    @Override
    public List<ShoppingCart> findByUid(long uid) {
        LambdaQueryWrapper<ShoppingCart> qw = new LambdaQueryWrapper<>();
        qw.eq(ShoppingCart::getUserId , uid);
        return shoppingCartDao.selectList(qw);
    }


    /**
     * 清除指定用户的购物车数据
     *
     * @param uid
     * @return
     */
    @Override
    public int clean(long uid) {
        LambdaQueryWrapper<ShoppingCart> qw = new LambdaQueryWrapper<>();
        qw.eq(ShoppingCart::getUserId , uid);
        return shoppingCartDao.delete(qw);
    }
}
